昨天成功用 XChart 畫出了第一張「每日睡眠時數折線圖」,所以今天打算繼續把前面做的其他分析結果也畫成圖表。第一張昨天已經完成,所以今天主要處理後面三張。
不同睡眠品質的平均睡眠時數-長條圖
把睡眠品質作為 X 軸、平均睡眠時數作為 Y 軸,最後再chart.addSeries("平均睡眠時數", categories, values);畫成長條圖。
任務量 × 入睡時間-散佈圖
這張圖一樣可以用List把每筆資料中的 tasks 和 bedtime 取出來。昨天的折線圖是把每個資料點連起來,但散佈圖比較重視每個點的位置,所以這裡把顯示方式改成 Scatter。同樣使用 XYChart,只要改變 Series 的呈現方式,就可以變成散佈圖。
任務難度 × 睡眠品質-分組長條圖
這個是我遇到比較複雜的「任務難度 × 睡眠品質」。因為資料同時有「任務難度」和「睡眠品質」兩種分類,所以不能像第一張長條圖只放一組資料,而是需要分別統計不同任務難度下,各種睡眠品質出現的次數。這裡使用 Set 收集有哪些睡眠品質,避免重複,再透過迴圈依序建立不同的 Series。
1.資料型態的錯誤:Series data must be either Number or Date type!!!
一開始看到這個錯誤完全不知道問題在哪,後來才發現是折線圖中的日期導致的。
原本 CSV 裡的日期:2026-09-01看起來是很單純的日期,但它從 CSV 讀進 Java 後其實還是 String。而使用的 XYChart 需要的是int型態的 Number 或 Date,所以不能直接把原本的日期字串放進去。
需要加入 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");和sdf.parse(r.getDate())把原本的 String 轉換成 Date,才可以正常交給圖表使用。
這個問題也讓我想到之前在弄資料清理。著重在 N/A、重複資料或異常值等資料內容,但其實資料型態在分析和製圖上也是需要注意的一部分。
2.程式設定好圖表,卻沒有看到視窗
把四張圖的程式都設定好後,我原本以為執行程式就可以直接看到圖表,但實際執行後卻沒有像預期一樣出現四個視窗。後來才發現,建立圖表和把圖表顯示出來其實是兩件不同的事情。XYChartBuilder 和 CategoryChartBuilder 是負責建立圖表,但如果真的要讓圖表顯示在視窗中,還需要另外使用 SwingWrapper。
所以最後我把四張圖分別放進 showAllCharts():
這樣在 Main.java 呼叫 showAllCharts() 後,就可以一次顯示四張圖表。